package de.h_da.fbi.cg.pointcloud.parser.asc;

import java.io.IOException;
import java.io.InputStream;
import java.util.Locale;
import java.util.Scanner;

import org.anddev.progressmonitor.ProgressMonitor;

import de.h_da.fbi.cg.pointcloud.adt.Vertex;
import de.h_da.fbi.cg.pointcloud.adt.VertexList;
import de.h_da.fbi.cg.pointcloud.util.StreamUtils;
import de.h_da.fbi.cg.pointcloud.util.constants.Constants;

/**
 * @author Nicolas Gramlich
 * @since 17:15:57 - 25.10.2010
 */
public class ASCParser {
	// ===========================================================
	// Constants
	// ===========================================================

	// ===========================================================
	// Fields
	// ===========================================================

	// ===========================================================
	// Constructors
	// ===========================================================

	// ===========================================================
	// Getter & Setter
	// ===========================================================

	// ===========================================================
	// Methods for/from SuperClass/Interfaces
	// ===========================================================

	// ===========================================================
	// Methods
	// ===========================================================

	public static VertexList parseAscii(final InputStream pInputStream, final ProgressMonitor pProgressMonitor) throws IOException {
		pProgressMonitor.onProgressChanged(0);

		final Scanner scanner = new Scanner(pInputStream).useLocale(Locale.US);
		try {
			final VertexList out = new VertexList();

			int i = 0;
			while(scanner.hasNextFloat()) {
				/* Read x/y/z of each vertex. */
				final float x = scanner.nextFloat();
				final float y = scanner.nextFloat();
				final float z = scanner.nextFloat();

				if(i % Constants.SAMPLE_RATE == 0) {
					out.add(new Vertex(x, y, z));
				}
				i++;
			}

			pProgressMonitor.onProgressChanged(100);

			return out;
		} finally {
			StreamUtils.closeStream(pInputStream);
		}
	}

	// ===========================================================
	// Inner and Anonymous Classes
	// ===========================================================
}
